package ecg.util;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Vector;

/**
 * 문자열을 처리하는데 있어서 String 클래스에서 제공하지 못하는
 * 함수를들 제공한다. 모든 메쏘드는 static이다. 기본 생성자를 private으로
 * 선언하여 임으로 객체를 생성할 수 없다. 따라서 항상 클래스명으로 메쏘드를
 * 접근해야 한다.
 *
 * @author 유병무
 * @date 2010.03.22
 */
public class StringUtils {
	/**
	 * 객체를 생성할 수 없게 생성자를 private으로 정의한다.
	 */
	private StringUtils() {
		super();
	}
	
	public static String encodingIso8859ToUtf8(String str) throws Exception{
		return new String(str.getBytes("ISO-8859-1"), "UTF-8");
	}

	/**
	 * 주어진 문자열의 첫 글자를 대문자로 나머지는 소문자로 변형한
	 * 문자열 값을 돌려 준다.
	 *
	 * @param string 변형해야할 문자열.
	 *
	 * @return 첫글자 대문자 나머지는 소문자로 변경된 문자열.
	 */
	public static String toCapitalize(String string) {
		if ( string == null || "".equals(string) ) return string;

		if ( string.length() == 1 ) return string.toUpperCase();

		return Character.toUpperCase(string.charAt(0))
				+ string.substring(1).toLowerCase();
	}


	/**
	 * 주어진 String 객체 참조 변수가 null이거나 trim 처리후 빈 문자열("")이
	 * 되는지 검사한 결과를 돌려 준다.
	 *
	 * @param string 검사할 String 객체 참조.
	 * @return null이거나 trim후 빈 문자열("")이면 true, 그렇지 않으면 false.
	 */
	public static boolean isEmpty(String string) {
		return isEmpty(string, true);
	}


	/**
	 * 주어진 String 객체 참조 변수가 null이거나 afterTrim 값에 따라 trim 처리 후
	 * 빈 문자열("")이 되는지 검사한 결과를 돌려 준다. afterTrim이 true이면 Trim
	 * 처리 후 검사하고, false이면 Trim 처리하지 않고 검사한다.
	 *
	 * @param string    검사할 String 객체 참조.
	 * @param afterTrim 빈 문자열("")인지 검사시 Trim 처리 후 할 것인지 여부.
	 *                   true이면 처리후 검사, false이면 처리하지 않고 검사.
	 * @return string이 null 이거나 afterTrim 에 따라 처리 후 빈 문자열("")이 되면 true, 그렇지 않으면 false.
	 */
	public static boolean isEmpty(String string, boolean afterTrim) {
		/* null이면 비었다. */
		if ( string == null ) return true;

		boolean isEmpty = false;

		/* 넘어온 문자열이 null이 아니고 Trim 처리 후 빈문자열 여부를 검사하는 것이라면. */
		if ( ! isEmpty && afterTrim ) {
			isEmpty = "".equals(string.trim());
		}

		return isEmpty;
	}



	/**
	 *  문자열에 들어 있는 일부 문자열을 원하는 문자열로 교체한다.
	 *
	 *  @param   str     바꿀 문자열이 들어 있는 문자열
	 *  @param   oldStr  바뀌어질 문자열
	 *  @param   newStr  바꿀 문자열
	 */
	public static String replace (String str, String oldStr, String newStr) 
	{
		if (str == null || str.length() == 0) 
		{
			return str;
		}

		StringBuffer buff = new StringBuffer();

		int oldStrLength = oldStr.length();
		int startIndex   = 0;
		int endIndex     = str.indexOf (oldStr);

		while (endIndex > -1)
		{
			buff.append(str.substring(startIndex, endIndex)).append(newStr);

			startIndex = endIndex + oldStrLength;
			endIndex   = str.indexOf(oldStr, startIndex);
		}

		buff.append(str.substring(startIndex));

		return buff.toString();
	}


	/**
	 *  문자열을 특정 Encoding으로 바꾸었을 때 차지하는 Byte수를 돌려준다.
	 *
	 *  @param   str         Byte수를 셀 문자열
	 *  @para    encodeName  Encoding 이름
	 */
	public static int getByteCount (String str, String encodeName)
	throws java.io.UnsupportedEncodingException {
		return str.getBytes(encodeName).length;
	}

	/**
	 * Vector에 들어 있는 문자열들을 Array로 바꾸어 돌려준다.
	 */
	public static String [] toArray (Vector vector) {
		int count = vector.size();

		String [] strList = null;

		if (count > 0) {
			strList = new String[count];

			for (int i = 0; i < count; i++) {
				strList[i] = (String) vector.elementAt(i);
			}
		}

		return strList;
	}

	/**
	 *  문자열 배열을 받아 순서대로 합쳐서 하나의
	 *  문자열을 만들어 돌려준다. 이 때 배열에 들어 있는
	 *  문자들 사이에는 아무것도 들어가지 않는다.
	 */
	public static String merge (String [] strList) {
		return merge (strList, "");
	}


	/**
	 *  문자열 배열을 받아 순서대로 합쳐서 하나의
	 *  문자열을 만들어 돌려준다. 이 때 배열에 들어 있는
	 *  문자들 사이 넘어온 구별자를 넣어 주며, 넘어온
	 *  배열이 null일 경우에는 null을, 길이가 0인 배열이
	 *  넘어올 경우에는 빈문자열("")을 돌려준다.
	 */
	public static String merge (String [] strList, String delim) {
		if (strList == null) return null;
		if (strList.length == 0) return "";

		StringBuffer buff = new StringBuffer();

		for (int i = 0; i < strList.length; i++) {
			if (i > 0) buff.append(delim);

			buff.append (strList[i]);
		}

		return buff.toString();
	}


	/**
	 * 주어진 delimeter로 문자열을 나누어 돌려 준다.
	 * 구별자가 두 개 이상 연속으로 있을 때 그 사이의 빈 문자열을
	 * Token으로 할 지는 파라미터를 따른다.
	 *
	 * @param str   분리할 대상 문자열.
	 * @param delim 분리기준이 될 문자.
	 * @param trimmed 분리후 각 항목을 Trim 처리할 지 여부.
	 * @param excludeEmptyStr 빈 문자열 제외 여부.
	 * @return
	 */
	public static String [] split(String str, char delim, boolean trimmed, boolean excludeEmptyStr) {
		if (str == null) return null;

		ArrayList array = new ArrayList();

		char [] charList = str.toCharArray();

		StringBuffer buff = new StringBuffer();

		for (int i = 0; i < charList.length; i++) {
			char letter = charList[i];
			if (letter == delim) {
				String token = buff.toString();

				/* Trim 처리해야 하면 처리한다. */
				if ( trimmed ) token = token.trim();

				/* 빈 문자열은 제외이고 빈문자열이면 넘어간다. */
				if ( ! ( excludeEmptyStr && "".equals(token) ) ) {
					array.add(token);
				}

				/* 버퍼를 비운다. */
				buff.delete(0, buff.length());
			}
			else {
				buff.append(letter);
			}
		}

		String token = buff.toString();

		/* Trim 처리해야 하면 처리한다. */
		if ( trimmed ) token = token.trim();

		/* 빈 문자열은 제외이고, 빈문자열이면 넘어간다. */
		if ( ! ( excludeEmptyStr && "".equals(token) ) ) {
			array.add(token);
		}

		/* 사용한 StringBuffer를 Release시킨다. */
		buff.setLength(0);
		buff = null;

		return (String []) array.toArray(new String[0]);
	}


	/**
	 * 주어진 delimeter로 문자열을 나누어 돌려 준다.
	 * 구별자가 두 개 이상 연속으로 있을 때 그 사이의 빈 문자열도
	 * Token으로 인정하며 각 Token은 앞뒤 공백 문자들은 유지된다.
	 *
	 * @param str   분리할 대상 문자열.
	 * @param delim 분리기준이 될 문자.
	 * @param fixedCount
	 * @return
	 */
	public static String [] split(String str, char delim) {
		return split(str, delim, false, false);
	}


	/**
	 * 주어진 delimeter로 문자열을 나누어 돌려 준다.
	 * StringTokenizer와 다른 점은 구별자 하나마다
	 * Token을 나누는 것으로 간주한다는 것이다. 즉 구별자가
	 * 두 개 연속으로 있더라도 중간에 빈 문자열을 Token으로
	 * 간주한다.
	 *
	 * @param str   잘라낼 대상 문자열.
	 * @param delim 자를 때 기준이 되는 문자.
	 * @param fixedCount 잘라내어 생성한 문자열 배일의 갯수.
	 * @return
	 */
	public static String [] split(String str, char delim, int fixedCount) {
		if (str == null) return null;

		String [] strList = new String[fixedCount];

		Arrays.fill(strList, "");

		String [] tempList = split(str, delim);

		for (int i = 0; i < fixedCount && i < tempList.length; i++) {
			strList[i] = tempList[i];
		}

		return strList;
	}


	/**
	 * 문자열을 넘어온 구별자로 분리하여 문자열 배열 형태로
	 * 돌려 준다. StringTokenizer의 delim 문자열은 각
	 * Character가 구별자가 되지만 여기선 delim 값 전체가
	 * 구별자가 된다는 것이다.
	 *
	 * @param str   분리할 대상 문자열.
	 * @param delim 분리기준이 될 문자열.
	 * @param trimmed 분리후 각 항목을 Trim 처리할 지 여부.
	 * @param excludeEmptyStr 빈 문자열 제외 여부.
	 */
	public static String [] split (String str, String delim, boolean trimmed, boolean excludeEmptyStr) {
		if (str == null) return null;

		if (delim == null || delim.length() == 0) {
			return new String[] { str };
		}

		ArrayList array = new ArrayList();

		int delimLength = delim.length();
		int startIndex  = 0;
		int endIndex    = str.indexOf (delim);

		String token = null;
		while (endIndex > -1) {
			token = str.substring(startIndex, endIndex);

			/* Trim 처리해야 하면 처리한다. */
			if ( trimmed ) token = token.trim();

			/* 빈 문자열은 제외이고 빈문자열이면 넘어간다. */
			if ( ! ( excludeEmptyStr && "".equals(token) ) ) {
				array.add(token);
			}

			startIndex = endIndex + delimLength;
			endIndex   = str.indexOf(delim, startIndex);
		}

		token = str.substring(startIndex);

		/* Trim 처리해야 하면 처리한다. */
		if ( trimmed ) token = token.trim();

		/* 빈 문자열은 제외이고 빈문자열이면 넘어간다. */
		if ( ! ( excludeEmptyStr && "".equals(token) ) ) {
			array.add(token);
		}

		return (String []) array.toArray(new String[0]);
	}


	/**
	 * 문자열을 넘어온 구별자로 분리하여 문자열 배열 형태로
	 * 돌려 준다. StringTokenizer의 delim 문자열은 각
	 * Character가 구별자가 되지만 여기선 delim 값 전체가
	 * 구별자가 된다는 것이다. 구별된 Token중 빈 문자열도
	 * 포함되며 각 Token은 앞뒤 공백 문자들도 유지된다.
	 *
	 * @param str   분리할 대상 문자열.
	 * @param delim 분리기준이 될 문자열.
	 */
	public static String [] split (String str, String delim) {
		return split(str, delim, false, false);
	}


	/**
	 * 문자열을 넘어온 구별자로 분리하여 문자열 배열 형태로
	 * 돌려 준다. 이 때 분리된 문자열이 넘어온 크기값보다 많아도
	 * 그 수만큼만을 배열에 넣어 주고, 주어진 크기보다 적으면
	 * 나머지는 빈 문자열로 채워서 돌려 준다.
	 */
	public static String [] split (String str, String delim, int fixedCount) {
		if (str == null || str.length() == 0
				|| delim == null || delim.length() == 0) return null;

		String [] strList = new String[fixedCount];

		// strList를 빈 문자열로 초기화한다.
		Arrays.fill(strList, "");

		String [] tempList = split(str, delim);

		for (int i = 0; i < fixedCount && i < tempList.length; i++) {
			strList[i] = tempList[i];
		}

		return strList;
	}


	/**
	 * 주어진 문자열을 주어진 byte씩 잘라서 String 배열로 돌려 준다.
	 * byteCount 값은 2 이상이어야 한다. 그 이하면 파라미터로 준
	 * 문자열을 그대로 돌려 준다. 만일 잘리는 위치가 두 바이트 문자를
	 * 나누게 되면 한 바이트 앞을 자른다.
	 *
	 * @param str
	 * @param width
	 * @return
	 */
	public static String [] split(String str, int byteCount) {
		if (byteCount < 2) return new String[]{ str };

		byte [] bytes = null;

		ArrayList array = new ArrayList();

		try {
			bytes = str.getBytes("euc-kr");

			if (bytes.length <= byteCount) return new String[]{ str };

			int sIndex = 0;

			while (bytes.length > sIndex + byteCount) {
				int length = byteCount;

				if (bytes[sIndex + length - 1] < 0 && countMinusByte(bytes, sIndex, sIndex + length - 2) % 2 == 0) {
					length--;
				}

				array.add(new String(bytes, sIndex, length, "euc-kr"));

				sIndex += length;
			}

			if (sIndex < bytes.length) array.add(new String(bytes, sIndex, bytes.length - sIndex, "euc-kr"));

		}
		catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}

		return (String []) array.toArray(new String[0]);
	}



	/**
	 *  주어진 숫자의 왼쪽에 모자란 길이만큼 공백문자(' ')로 채워서 돌려 준다.
	 *
	 *  @author   김홍진
	 *  @date     2007.06.29
	 *
	 *  @param   integer    Pad를 만들어 붙여주어야 할 int 값
	 *  @param   fullLength Padding 했을 때 전체 문자열 폭
	 */
	public static String padLeft(int integer, int fullLength) {
		return padLeft(String.valueOf(integer), fullLength);
	}


	/**
	 *  주어진 숫자의 오른쪽에 모자란 길이만큼 공백문자(' ')로 채워서 돌려 준다.
	 *
	 *  @author   김홍진
	 *  @date     2007.06.29
	 *
	 *  @param   integer    Pad를 만들어 붙여주어야 할 int 값
	 *  @param   fullLength Padding 했을 때 전체 문자열 폭
	 */
	public static String padRight(int integer, int fullLength) {
		return padRight(String.valueOf(integer), fullLength);
	}


	/**
	 *  주어진 숫자의 왼쪽에 모자란 길이만큼 문자 '0'으로 채워서 돌려 준다.
	 *
	 *  @author   김홍진
	 *  @date     2007.06.29
	 *
	 *  @param   integer    Pad를 만들어 붙여주어야 할 int 값
	 *  @param   fullLength Padding 했을 때 전체 문자열 폭
	 */
	public static String padLeftWithZero (int integer, int fullLength) {
		return padLeftWithZero(String.valueOf(integer), fullLength);
	}


	/**
	 *  주어진 문자열의 왼쪽에 모자란 길이만큼 문자 '0'으로 채워서 돌려 준다.
	 *
	 *  @author   김홍진
	 *  @date     2007.06.29
	 *
	 *  @param   str        Pad를 만들어 붙여주어야 할 문자열
	 *  @param   fullLength Padding 했을 때 전체 문자열 폭
	 */
	public static String padLeftWithZero (String str, int fullLength) {
		return padLeft (str, '0', fullLength);
	}


	/**
	 *  주어진 문자열의 오른쪽에 모자란 길이만큼 문자 '0'으로 채워서 돌려 준다.
	 *
	 *  @author   김홍진
	 *  @date     2007.06.29
	 *
	 *  @param   str        Pad를 만들어 붙여주어야 할 문자열
	 *  @param   fullLength Padding 했을 때 전체 문자열 폭
	 */
	public static String padRightWithZero (String str, int fullLength) {
		return padRight (str, '0', fullLength);
	}



	public final static int PADDING_LEFT  = 0;
	public final static int PADDING_RIGHT = 1;

	/**
	 *  주어진 문자열의 왼쪽에 모자란 길이만큼 공백문자(' ')로 채워서 돌려 준다.
	 *
	 *  @author   김홍진
	 *  @date     2007.06.29
	 *
	 *  @param   str        Pad를 만들어 붙여주어야 할 문자열
	 *  @param   fullLength Padding 했을 때 전체 문자열 폭
	 */
	public static String padLeft (String str, int fullLength) {
		return padLeft(str, ' ', fullLength);
	}


	/**
	 *  주어진 문자열의 왼쪽에 모자란 길이만큼 주어진 문자로 채워서 돌려 준다.
	 *
	 *  @author   김홍진
	 *  @date     2007.06.29
	 *
	 *  @param   str        Pad를 만들어 붙여주어야 할 문자열
	 *  @param   padChar    Padding에 사용될 문자
	 *  @param   fullLength Padding 했을 때 전체 문자열 폭
	 */
	public static String padLeft (String str, char padChar, int fullLength) {
		return pad (str, padChar, fullLength, PADDING_LEFT);
	}


	/**
	 *  주어진 문자열의 오른쪽에 모자란 길이만큼 공백문자(' ')로 채워서 돌려 준다.
	 *
	 *  @author   김홍진
	 *  @date     2007.06.29
	 *
	 *  @param   str        Pad를 만들어 붙여주어야 할 문자열
	 *  @param   fullLength Padding 했을 때 전체 문자열 폭
	 */
	public static String padRight (String str, int fullLength) {
		return padRight(str, ' ', fullLength);
	}

	/**
	 *  주어진 문자열의 오른쪽에 모자란 길이만큼 주어진 문자로 채워서 돌려 준다.
	 *
	 *  @author   김홍진
	 *  @date     2007.06.29
	 *
	 *  @param   str        Pad를 만들어 붙여주어야 할 문자열
	 *  @param   padChar    Padding에 사용될 문자
	 *  @param   fullLength Padding 했을 때 전체 문자열 폭
	 */
	public static String padRight (String str, char padChar, int fullLength) {
		return pad (str, padChar, fullLength, PADDING_RIGHT);
	}


	/**
	 *  주어진 문자열의 왼쪽이나나 오른쪽에 모자란 길이만큼 주어진 문자로
	 *  채워서 돌려 준다.
	 *
	 *  @author   김홍진
	 *  @date     2007.06.29
	 *
	 *  @param   str        Pad를 만들어 붙여주어야 할 문자열
	 *  @param   padChar    Padding에 사용될 문자
	 *  @param   fullLength Padding 했을 때 전체 문자열 폭
	 *  @param   dir        Padding을 붙일 방향. PADDING_LEFT이면 왼쪽에,
	 *                      PADDING_RIGHT면 오른쪽에 붙이다.
	 */
	public static String pad (String str, char padChar, int fullLength, int paddingDir) {
		if (str == null) return null;

		int size = str.getBytes().length;

		if (size >= fullLength) return str;

		int padCount = fullLength - size;
		StringBuffer buff = new StringBuffer();
		for (int i = 0; i < padCount; i++) {
			buff.append(padChar);
		}

		if (paddingDir == PADDING_LEFT) {
			str = buff.append(str).toString();
		}

		if (paddingDir == PADDING_RIGHT) {
			str = str + buff;
		}

		return str;
	}


	/**
	 *  String 변수 str에 null값이 할당되어 있다면 빈문자열로
	 *  대치시키고, 그렇지 않으면 본래의 값을 돌려 준다.
	 *
	 *  @author  김홍진
	 *  @date    2007.06.29
	 *
	 *  @param   str     null 인지 검사할 String 객체 변수
	 */
	public static String replaceNull(String str) {
		return replaceNull(str, "");
	}


	/**
	 *  String 변수 str에 null값이 할당되어 있다면 대치 문자열로
	 *  대치시키고, 그렇지 않으면 본래의 값을 돌려 준다.
	 *
	 *  @author  김홍진
	 *  @date    2007.06.29
	 *
	 *  @param   str     null 인지 검사할 String 객체 변수
	 *  @param   altStr  str 값이 null일 때 대치할 문자열
	 */
	public static String replaceNull(String str, String altStr) {
		return str == null ? altStr : str;
	}


	/**
	 *  넘어온 정수형값이 0이면 빈문자열 ""을, 0이 아니면 그 숫자를
	 *  그대로 문자열로 바꾼 것을 돌려 준다.
	 *
	 *  @author   김홍진
	 *  @date     2007.06.29
	 */
	public static String replaceZero (long l) {
		return l == 0 ?  "" : l + "";
	}


	/**
	 *  넘어온 소스형 값이 0이면 빈문자열 ""을, 0이 아니면 그 숫자를
	 *  그대로 문자열로 바꾼 것을 돌려 준다.
	 *
	 *  @author   김홍진
	 *  @date     2007.06.29
	 */
	public static String replaceZero (double d) {
		return d == 0 ?  "" : d + "";
	}



	/**
	 *  실제 문자열 값이 true인지 false인지 판단한다.
	 *  처음엔 getBoolean(String)에 있었으나, getBooleanValues를
	 *  만들기 위해 밖으로 따로 작성하였다.
	 *
	 *  @author   김홍진
	 *  @date    2007.06.29
	 *
	 */
	public static boolean estimateBoolean (String boolStr) {
		return "Y".equalsIgnoreCase(boolStr)
				|| "T".equalsIgnoreCase(boolStr)
				|| "yes".equalsIgnoreCase(boolStr)
				|| "true".equalsIgnoreCase(boolStr)
				|| "1".equals(boolStr);
	}


	/**
	 * 주어진 갯수만큼의 String 배열을 만들고, 각 String을
	 * 빈 문자열("")로 초기화 하여 돌려 준다.
	 *
	 * @author 김홍진
	 * @date     2007.06.29
	 *
	 * To change this generated comment go to
	 * Window>Preferences>Java>Code Generation>Code and Comments
	 */
	public static String [] makeArray(int count) {
		return makeArray(count, "");
	}


	/**
	 * 주어진 갯수만큼의 String 배열을 만들고 각 String을 주어진
	 * String 값으로 초기화하여 돌려 준다.
	 *
	 * @param count
	 * @param initValue
	 * @return
	 */
	public static String [] makeArray(int count, String initValue) {
		String [] strList = new String[count];

		for (int i = 0; i < strList.length; i++) {
			strList[i] = initValue;
		}

		return strList;
	}



	/**
	 * 주어진 문자열을 원하는 폭만큼 자르고 뒤에 계속됨 표시(...)를 해 준다.
	 * 이때 문제는 한글처럼 2바이트를 차지하는 경우 중간에 잘리는 경우인데
	 * 마지막 byte의 크기를 점검하여 127 보다 크면 2바이트 문자의 첫번째
	 * 바이트인 걸로 판단하여 그 바이트까지 제외 시킨다.
	 *
	 * @author 김홍진
	 * @date     2007.06.29
	 *
	 * To change the template for this generated type comment go to
	 * Window>Preferences>Java>Code Generation>Code and Comments
	 */
	public static String elipse(String str, int maxWidth) {
		byte [] bytes = null;

		try {
			bytes = str.getBytes("euc-kr");
		}
		catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}

		if (bytes.length <= maxWidth) return str;


		// 잘린 마지막 바이트의 크기가 0보다 작으면
		// 이 바이트가 두바이트 문자의 첫번째 바이트인지
		// 두번째 바이트인지를 판단하여 첫번째 바이트이면
		// 마지막 바이트까지 잘라 낸다. 왜냐하면 ASCII 값은
		// 0~127을 사용하고 두바이트 문자들의 첫번째
		// 문자는 음수 값을 가지기 때문이다.
		// 첫번째인지 두번째인지의 판단은 그 앞 byte들 중에
		// 0보다 작은 값이 짝수개면 첫번째 바이트, 홀수 개 이면
		// 두번째 바이트인 걸로 판단한다.
		int length = maxWidth - 2;
		if (bytes[length - 1] < 0 && countMinusByte(bytes, length - 2) % 2 == 0) {
			length--;
		}

		StringBuffer buff = new StringBuffer();
		buff.append(new String(bytes, 0, length)).append("...");

		return buff.toString();
	}


	/**
	 * 주어진 바이트 배열 중에 index가 0부터 limit인 것 중에
	 * 음수인 것의 갯수를 세어 올려 준다.
	 *
	 * @param bytes
	 * @param limit
	 * @return
	 */
	private static int countMinusByte(byte [] bytes, int limit) {
		return countMinusByte(bytes, 0, limit);
	}



	/**
	 * 주어진 바이트 배열 중에 index가 offset부터 limit인 것 중에
	 * 음수인 것의 갯수를 세어 올려 준다.
	 *
	 * @param bytes
	 * @param limit
	 * @return
	 */
	private static int countMinusByte(byte [] bytes, int offset, int limit) {
		int count = 0;

		for (int i = offset; i <= limit; i++) {
			if (bytes[i] < 0) count++;
		}

		return count;
	}
	
	
	/**
	 * 주어진 문자열을 대문자로 변환해서 반환한다.
	 * 
	 * @param data
	 * @return
	 */
	public static String toUpperCase(String data)
	{
		
		return data.toUpperCase();
	}
	
	
	/**
	 * 주어진 문자열에서 엔터 또는 new line 에스케이프 문자를 <br/>로 변환해서 반환한다.
	 * 
	 * @param data
	 * @return
	 */
	public static String nl2br(String str)
	{
		str = str.replaceAll("\r\n", "<br/>");
		str = str.replaceAll("\r", "<br/>");
		str = str.replaceAll("\n", "<br/>");
		  
		return str;
	}
}
